package fr.mistra.exercice.bibliotheque.services;

import java.util.List;


import fr.mistra.exercice.bibliotheque.dao.BibliothequeDAO;
import fr.mistra.exercice.bibliotheque.dao.DAOException;
import fr.mistra.exercice.bibliotheque.dao.DAOFactory;
import fr.mistra.exercice.bibliotheque.dao.LivreDAO;
import fr.mistra.exercice.bibliotheque.dao.NoSuchIdException;
import fr.mistra.exercice.bibliotheque.modeles.Bibliotheque;
import fr.mistra.exercice.bibliotheque.modeles.Livre;
import fr.mistra.exercice.bibliotheque.services.NoMoreRoomException;

public class BibliothequeService {
	private static BibliothequeService service;
	private BibliothequeDAO dao;
	
	private BibliothequeService() {
		dao = DAOFactory.getBibliothequeDAO();
	}
	
	public static BibliothequeService getService() {
		if (service == null) {
			service = new BibliothequeService();
		}
		return service;
	}
	
	/**
	 * Cr�e une nouvelle Bibliotheque, vide.
	 * 
	 * @param nom		Le nom de la nouvelle biblioth�que.
	 * @param capacite	Le nombre maximal de livres qu'elle pourra accueillir.
	 * @return La Bibliotheque cr��e.
	 * @throws DAOException si un probl�me li� � la DAO est survenu.
	 */
	public Bibliotheque creeNouvelleBibliothequeVide(String nom, int capacite) throws DAOException {
		Bibliotheque b = new Bibliotheque(nom, capacite);
		dao.ajouterBibliotheque(b);	//Se chargera de modifier this.id avec l'id affect� � cette Bibliotheque.
		return b;
	}

	/**
	 * Retourne une Biblioth�que correspondant � une biblioth�que existante
	 * @param id					L'id de la biblioth�que voulue
	 * @return						La Biblioth�que voulue
	 * @throws DAOException			si la DAO a rencontre un probl�me.
	 * @throws NoSuchIDException	si la DAO ne connait pas de Bibliotheque ayant cet id.
	 */
	public Bibliotheque getBibliotheque(long id) throws DAOException, NoSuchIdException {
		return dao.getBibliotheque(id);
	}

	public List<Bibliotheque> getBibliotheques() throws DAOException {
		return dao.getBibliotheques();
	}

	/**
	 * Obtenir la liste des livres de la bibliotheque donn�e.
	 * @return
	 * @throws DAOException
	 * @throws NoSuchIdException
	 */
	public List<Livre> getContenu(Bibliotheque b) throws DAOException, NoSuchIdException {
		LivreDAO daoLivre = DAOFactory.getLivreDAO();
		return daoLivre.getLivres(b.getId());
	}

	/**
	 * Ajoute un livre existant � cette biblioth�que
	 * @param b						La biblioth�que � laquelle ajouter le livre
	 * @param livre					Le livre � ajouter
	 * @throws DAOException			Si un probl�me de DAO survient
	 * @throws NoMoreRoomException	Si la biblioth�que est d�ja pleine
	 */
	public void ajouterLivre(Bibliotheque b, Livre livre) throws DAOException, NoMoreRoomException {
		LivreDAO daoLivre = DAOFactory.getLivreDAO();
		
		List<Livre> liste;
		try {
			liste = daoLivre.getLivres(b.getId());
		} catch (NoSuchIdException e) {
			//Ne devrait jamais arriver, on devrait toujours avoir un id correct pour la Bibliotheque.
			e.printStackTrace();
			liste = null;
		}
		if (liste.size() == b.getCapacite()) throw new NoMoreRoomException(b);
		
		try {
			daoLivre.ajouterLivre(livre.getId(), b.getId());
		} catch (NoSuchIdException e) {
			//Ne devrait jamais arriver, on devrait tojours avoir des id corrects, ici.
			System.out.println("Z");
			e.printStackTrace();
		}
	}
}
